package com.jingzhun;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.*;

/**
 * Created by Administrator on 2019/7/15 0015.
 */
@Slf4j
public class test {
    private static final Logger log = LoggerFactory.getLogger(test.class);
    /**
     * 兔子，出生后3个月开始每月生一对兔子，小兔子长到第四个月
     * 又生一对兔子，加入兔子不死，问每月的兔子总数
     */
    @Test
    public void test1() {
//        程序分析：1、1、
    }

    /**
     * 判断101-200之间有多少素数，并输出所有素数
     */
    @Test
    public void test2() {
//        程序分析：1、3、5
//        只能被1和自己整除
        ArrayList arrayList = new ArrayList<>();
        test:
        for (int i = 100; i <= 200; i++) {
            for (int i1 = 2; i1 < i; i1++) {
                if (i % i1 == 0) {
                    continue test;
                }
                if (i - i1 == 1) {
                    arrayList.add(i);
                }
            }
        }
        System.out.println(arrayList.toString());
    }

    /**
     * 水仙花是指三位数，各位数的平方和等于这个数本身
     */
    @Test
    public void test3() {
//        153=1^3+5^3+3^3
        for (int i = 100; i <= 999; i++) {
//            个位
            int g = i % 10;
//            百位
            int b = i / 100;
//            十位
            int s = i % 100 / 10;
            if (g * g * g + b * b * b + s * s * s == i) {
                System.out.println("水仙花为：" + i);
            }
        }
    }

    // 将一个正整数分解质因数   90=2*3*3*5
    @Test
    public void test4() {
//        先获取最小的质数作为第一个除数
//        再获取第二个除数，如果这个除数为质数，则终止
//        否则获取第二个除数的因子，直到所有因子为质数为止
        Integer i=90;
        List<Integer> list = new ArrayList<>();
        List<Integer> integers = obtainPrimeNumber(i, list);
        System.out.println(i+"分解的质因数为"+integers);
    }


//

    /**
     *  判断是否为质数
     * @param num  数字
     * @return true_质数   false_非质数
     */
    public boolean judge(int num){
        if(num==1){
            return false;
        }
        boolean f=true;
        for(int i=2;i<num/2;i++){
            if(num%i==0){
                f=false;
                break;
            }
        }
        return f;
    }

    /**
     *  获取能被整除的最小质数
     * @param num 数字
     * @return
     */
    public List<Integer> obtainPrimeNumber(int num,List<Integer> list){
        if(judge(num)){
            list.add(num);
            return list;
        }
        for(int i=1;i<num/2;i++){
            if(judge(i)&&num%i==0){
                list.add(i);
                return obtainPrimeNumber(num/i,list);
            }
        }
        return list;
    }

    /**
     * 学习成绩=90分同学用A表示，60-89分之间的用B表示，60分以下的用C表示
     */
    @Test
    public void test5(){
        int i=45;
        System.out.println("学习等级为："+(i>90?"A":(i>60?"B":"C")));
    }

    /**
     * 求两个正整数m和n的最大公约数和最小公倍数
     */
    @Test
    public void test6(){

        int m=5;
        int n=7;
        int min=m<n?m:n;
//        最大公约数
        int maxNum=1;
        for(int i=min/2;i>=2;i--){
            if(m%i==0&&n%i==0){
                maxNum=i;
                System.out.println("最大公约数："+i);
                break;
            }
            System.out.println("最大公约数："+1);
        }
//      最小公倍数
        int i = m * n / maxNum;
        System.out.println("最小公倍数："+i);

    }

    /**
     * s=a+aa+aaa+aaaa+aaaaa,指定a的值和加数的个数，求s
     */
    @Test
    public void test7(){
        int a=2;
        int n=5;
        int sum=0;
        int m=0;
        for(int i=1;i<=n;i++){
            m+=a;
            m=m*10;
            sum+=m;
        }
        System.out.println(sum);
    }


    /**
     * 完数：一个数恰好等于其因子之和，例如6=1+2+3. 找出1000以内的完数
     */
    @Test
    public void test8(){
//    程序分析：  1.  求出所有因子
//              2.  求出因子之和
//              3. 判断因子之和是否与本身相等
        for (int i = 1; i < 1000; i++) {
            int sum=0;
            for (int i1 = 1; i1 < i ; i1++) {
                if(i%i1==0){
                    sum+=i1;
                }
            }
            if(sum==i){
                System.out.println("完数为："+i);
            }
        }
//        28=1+2+4+14+7；
    }

    /**
     * 一球从100米自由落下，每次落地后跳回到原高度一半；再落下，求它第10次落地时，共经过多少米？第10次反弹多高？
     */
    @Test
    public void test9(){
//        程序分析：1. 10次反弹多高，需要知道每次反弹的高度和经过多少米
//                 2. 计算每次反弹高度和经过多少米，需要知道初始自由落体距离
        int initHight=100;
        Integer sum=0;
        for (int i = 1; i <= 10; i++) {
            Map<String, Integer> stringIntegerMap = freeFall(initHight);
            initHight= stringIntegerMap.get("hight");
            sum += stringIntegerMap.get("sum");
            log.error("第{}次反弹高度为：{}，共经过了{}米",i,initHight,sum);
        }

    }

    public Map<String,Integer> freeFall(int meter){
        int hight=meter/2;
        int sum=meter+hight;
        HashMap<String, Integer> stringIntegerHashMap = new HashMap<>();
        stringIntegerHashMap.put("hight",hight);
        stringIntegerHashMap.put("sum",sum);
        return stringIntegerHashMap;
    }

    /**
     * 1/2/3/4 可以组成多少个互不相同且无重复数字的三位数
     */
    @Test
    public void test10(){
//        程序分析：1. 获取所有的三位数
//                2. 求出所有三位数，数字不重复
        int count=0;
        for (int i = 1; i <=4; i++) {
            for (int i1 = 1; i1 <= 4; i1++) {
                for (int i2 = 1; i2 <= 4; i2++) {
                    if(i!=i1&&i1!=i2&&i!=i2){
                        count+=1;
                        int num=i*100+i1*10+i2;
                        log.error("第{}个符合条件的三位数为：{}",count,num);
                    }
                }
            }
        }
    }

    /**
    *       lirun<=100000,提成10%
     *       100000<lirun<=200000 提成7.5%
     *       200000<lirun<=400000 提成5%
     *       400000<lirun<=600000 提成3%
     *       600000<lirun<=1000000 提成1.5%
     *       1000000<lirun        提成1%
    *
    **/
    @Test
    public void test11(){
        int lirun=1100000;
//        程序分析： 1. 获取总利润
//                  2. 由每部分利润求和
        double sum=0;
        int num=0;
        if(lirun>1000000){
           num= lirun - 1000000;
            sum=num*0.01+400000*0.015+200000*0.03+200000*0.05+100000*0.751+100000*0.01;
            System.out.println("100万部分："+sum);
        }else if(600000<lirun && lirun<=1000000){
            num=lirun-600000;
            sum+=num*0.015+200000*0.03+200000*0.05+100000*0.751+100000*0.01;
            System.out.println("60万-100万部分："+sum);
        }else if(400000<lirun && lirun<=600000){
            num=lirun-400000;
            sum=num*0.03+200000*0.05+100000*0.751+100000*0.01;
            System.out.println("40万-60万部分："+sum);
        }else if(200000<lirun && lirun<=400000){
            num=lirun-200000;
            sum=num*0.05+100000*0.751+100000*0.01;
            System.out.println("20万-40万部分："+sum);
        }else if(100000<lirun && lirun<=200000){
            num = lirun - 100000;
            sum=num*0.075+100000*0.1;
            System.out.println("10万-20万部分："+sum);
        }else if(0< lirun && lirun<=100000){
            sum=lirun*0.1;
            System.out.println("10万以下部分："+sum);
        }
    }
    /**
    * 一个整数加上100后是完全平方数，加上168之后是完全平方数，求这个数
    *
    **/
    @Test
    public void test12(){
        for(int x=1;x<10000;x++){
            if (Math.sqrt(x + 100) % 1 == 0 && Math.sqrt(x + 100 + 168) % 1 == 0) {
                System.out.println("完全平方数为："+x);
            }
        }
    }

    /**
    *  输入某年某月某日，判断这一天是这一年的第几天？
    *
    **/
    @Test
    public void test13(){
        Calendar instance = Calendar.getInstance();
        instance.set(2019,6,26);
        int i = instance.get(Calendar.DAY_OF_YEAR);
        System.out.println(String.format("是第%s天",i));
    }

    /**
    *   输入x/y/z,请把这三个数由小到大输出
    *
    **/
    @Test
    public void test14(){
        int x=4;
        int y=1;
        int z=2;
        Integer[] a={x,y,z};
        Arrays.sort(a);
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
        System.out.println("lambdaI遍历");
        Arrays.asList(a).forEach(System.out::println);
        System.out.println("lambdaII遍历");
        Arrays.asList(a).forEach(item -> System.out.println(item));
    }
    /**
    * 输出9*9乘法表
    *
    **/
    @Test
    public void test15(){
        for (int i = 1; i <=9; i++) {
            for (int i1 = 1; i1 <=i; i1++) {
                System.out.print(i1+"*"+i+"="+i*i1+"\t");
            }
            System.out.println();
        }
    }
    
    /**
    * 猴子摘桃：当天吃了一半+1个
     * 第二天又吃了前天剩下的一半+1个
     * 最后一天只剩下一个桃
    *
    **/
    @Test
    public void test16(){
        int i=1;
        for (int i1 = 1; i1 <= 9; i1++) {
            i=2*(i+1);
        }
        System.out.println(i);
    }

    /**
    *  两支队伍：甲队（a.b.c） 乙队（x.y.z）
     *  a不和x比赛，c不和x、z比赛
    *
    **/
    @Test
    public void test17(){
    String[] team1={"a","b","c"};
    String[] team2={"x","y","z"};
        for (int i = 0; i < team1.length; i++) {
            for (int i1 = 0; i1 < team2.length; i1++) {
                if("a".equals(team1[i])&&"x".equals(team2[i1])){
                    continue;
                }
                if("c".equals(team1[i])&&("x".equals(team2[i1])||"z".equals(team2[i1]))){
                        continue;
                }
                System.out.println(team1[i]+" VS "+team2[i1]);
            }

        }
    }
    
    /**
    *  1
     * 111
     * 11111
     * 1111111
     * 111111
     * 111
     * 1
    **/
    @Test
    public void test18(){

        int n=8;
        int t=n%2==0?n/2:(n/2+1);
        for (int i = 1; i <=n; i++) {
            if(i<=t){
                for (int i2 = 1; i2 <=2 * i - 1; i2++) {
                    System.out.print("*");
                }
                System.out.println();
            }
            if(i>t){
                for (int i1 = 1; i1 <= ((n - i) + 1) * 2 - 1; i1++) {
                    System.out.print("*");
                }
                System.out.println();
            }
        }

    }


    /**
    *   五个人坐在一起ABCDE，求E多少岁？
     *   E比D大2岁，即E-D=2
     *   D-C=2;
     *   C-B=2;
     *   B-A=2;
     *   A=10;
    *
    **/
    @Test
    public void test19(){

        int i = ageAccumulate(5);
        log.error("E的年龄为："+i);
    }
    public int ageAccumulate(int n){
        if(n==1){
            return 10;
        }
        return ageAccumulate(n-1)+2;
    }

    /**
    *   给一个5位之内数，
     *   1. 求它是几位数
     *   2. 逆序打印各位数字
    *
    **/
    @Test
    public void test20(){
        int b=11222;
        int count=0;
        for (int i = 10; i <= 100000; i=i*10) {
            count++;
            if(b%i==b){
                System.out.println("b是"+count+"位");
                break;
            }
        }
        String str=b+"";
        String[] split = str.split("");
        for (int length = split.length-1; length >= 0; length--) {
            System.out.println(split[length]);

        }
    }
    /**
    *   判断5位数，是不是回文数
    *
    **/
    @Test
    public void test21(){
        int a=12321;
        String str=a+"";
        StringBuffer stringBuffer = new StringBuffer(str);
        StringBuffer reverse = stringBuffer.reverse();

        String s = reverse.toString();
        if(str.equals(s)){
            System.out.println("是回文数");
        }else{
            System.out.println("不是回文数");
        }
    }

    /**
    *
    * 求100以内素数
    **/
    @Test
    public void test22(){
        for (int i = 2; i < 100; i++) {
            boolean b=true;
            for (int i1 = 2; i1 <= i/2; i1++) {
                if(i%i1==0){
                    b=false;
                    continue;
                }
            }
            if(b==true){
                System.out.println("素数为："+i);
            }
        }
    }

    /**
    * 在已排好序的数组中插入一个数据
    *
    **/
    @Test
    public void test23(){
        int i1=5;
        int[] a={1,3,6,8};
        int[] b=new int[a.length+1];
        int index=0;
        for (int i = 0; i < a.length; i++) {
            if(i1<a[i]){
                index=i;
                break;
            }
        }
        System.out.println(index);
        for (int i = 0; i < index; i++) {
            b[i]=a[i];
        }
        b[index]=i1;
        System.out.println(Arrays.toString(a));
        for(int i=index+1;i<b.length;i++){
            b[i]=a[i-1];
        }
    }
    
    /**
    *  将数组逆序输出
    *
    **/
    @Test
    public void test24(){
        Integer[] a={1,2,3};
        List<Integer> ints = Arrays.asList(a);
        ints.forEach(integer -> System.out.println(integer));


        for (int length = a.length; length > 0; length--) {
            System.out.println(a[length-1]);
        }
    }

    /**
    *  打印杨辉三角形
     *  1
     *  1 1
     *  1 2 1
     *  1 3 3 1
     *  1 4 6 4 1
     *  1 5 10 10 5 1
     *
    **/
    @Test
    public void test25(){


    }
}